package com.algorithm.hash;

import java.util.TreeMap;

/**
 * @Author: DOWN
 * @Date: 2022/8/8 10:40
 * @Comment: 自定义hash实现
 */
public class HashTable<K,V> {
    private TreeMap<K,V>[] hashtable;
    private int M;
    private int size;
    public HashTable(int M){
        this.M=M;
        size=0;
        hashtable=new TreeMap[M];
        for(int i=0;i<M;i++){
            hashtable[i]=new TreeMap<>();
        }
    }

    /**
     * 默认赋值table的个数
     */
    public HashTable(){
        this(97);
    }

    /**
     * 位于存储的符号
     * @param key 主键
     * @return hash值
     */
    private int hash(K key){
        return (key.hashCode()&0x7fffffff)%M;
    }

    /**
     * 获取hash元素长度
     * @return int
     */
    public int getSize(){
        return size;
    }

    /**
     * 根据主键添加hash值
     * @param key 主键
     * @param value 元素值
     */
    private void add(K key,V value){
        TreeMap<K,V> map=hashtable[hash(key)];
        if (map.containsKey(key)){
            map.put(key,value);
        }else{
            map.put(key,value);
            size++;
        }
    }

    /**
     * 删除主键对应的hash值
     * @param key 主键
     * @return 元素值
     */
    public V remove(K key){
        TreeMap<K,V> map=hashtable[hash(key)];
        V ret=null;
        if (map.containsKey(key)){
            ret=map.remove(key);
            size--;
        }
        return ret;
    }

    /**
     * 对已有的hash赋值
     * @param key 主键
     * @param value 元素值
     */
    public void set(K key,V value){
        TreeMap<K,V> map=hashtable[hash(key)];
        if (!map.containsKey(key)){
            throw new IllegalArgumentException(key+" doesn't exit!");
        }
        map.put(key,value);
    }

    /**
     * 是否包含
     * @param key 主键
     * @return boolean
     */
    public boolean contains(K key){
        return hashtable[hash(key)].containsKey(key);
    }

    /**
     * 获取元素值
     * @param key 主键
     * @return 元素值
     */
    public V get(K key){
        return hashtable[hash(key)].get(key);
    }
}
